home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_10_07
/
1007064a
< prev
next >
Wrap
Text File
|
1991-03-27
|
4KB
|
157 lines
/***********************************************
* *
* "DON'T MESS WITH MARILYN" *
* *
* MONTE CARLO SIMULATION *
* *
* 02/21/91, M.E. Brandt, Ph.D. *
* *
***********************************************/
#include <stdio.h>
#define BIT_MASK 7
#define NO_DOORS 3.0
#define RANDFACTOR (32768.0 * (1.0/NO_DOORS))
main()
{
int i, n, car, choice, open, count;
unsigned char u[2], doors, noprize, mask, not_open,
not_choice;
double prob;
srand(1);
do {
fprintf(stderr,
"\nHow many games of not-switching, and switching\
would you like?: ");
scanf("%d", &n);
printf("\n\nNumber of trials in this series is %d\n",
n);
/* LOOP IN WHICH CONTESTANT DOES NOT SWITCH */
for(count=i=0; i<n; i++) {
doors = 1;
/* get a random number between 0 and 2 to hide
car behind door # */
car = (int)((double)rand()/RANDFACTOR);
doors <<= car; /* status of doors */
noprize = ~doors & BIT_MASK; /* doors with goats */
/* contestant picks a door */
choice = (int)((double)rand()/RANDFACTOR);
/* host reveals a door which is not 'choice'
and not 'car' (a goat!) */
mask = noprize & ((~(1 << choice)) & BIT_MASK);
/* host always picks first one not satisfying
condition */
open = 0;
while(!(mask & 1)) {
mask >>= 1;
open++;
}
if(choice == car) count++;
/* since the contestant did not switch, 'choice'
does not depend on 'open'! */
}
prob = (double)count/(double)n;
printf(
"\nPercentage of wins for non-switching is %.1f",
prob * 100.0);
/* LOOP IN WHICH CONTESTANT SWITCHES CHOICE */
for(count=i=0; i<n; i++) {
doors = 1;
/* get a random number between 0 and 2 to hide car
behind door # */
car = (int)((double)rand()/RANDFACTOR);
doors <<= car; /* status of doors */
noprize = ~doors & BIT_MASK; /* doors with goats */
/* contestant picks a door */
choice = (int)((double)rand()/RANDFACTOR);
/* host reveals a door which is not 'choice' and not
'car' */
mask = noprize & ((~(1 << choice)) & BIT_MASK);
open = 0;
while(!(mask & 1)) {
mask >>= 1;
open++;
}
/* now the contestant switches to door which is not
'choice' and not 'open' */
not_choice = ~(1 << choice) & BIT_MASK;
not_open = ~(1 << open) & BIT_MASK;
choice = not_open & not_choice;
/* if switched choice = original status of 'doors'
it's a "win"! */
if(choice == doors) count++;
}
prob = (double)count/(double)n;
printf("\nPercentage of wins for switching is %.1f\n",
prob * 100.0);
printf("\n-----------------------------------------\
-----\n");
fprintf(stderr, "\nPlay Again?: ");
scanf("%s", u);
}
while(toupper(*u) == 'Y');
}